#ifndef HOLDOUT_H_
#define HOLDOUT_H_

#include <vector>
#include <iostream>

#include "MLP.h"
#include "DataSet.h"

using namespace std;

/*
 * =====================================================================================
 *        Class:  Holdout
 *  Description:  Classe que representa o algoritmo de Holdout
 * =====================================================================================
 */
class Holdout
{

public:

    /*-----------------------------------------------------------------------------
     *  Divide o conjunto de dados em 2 sub-amostras
     *-----------------------------------------------------------------------------*/
    Holdout(DataSet& ds);

    /*-----------------------------------------------------------------------------
     *  Executa o algoritmo de Holdout para o MLP passado
     *-----------------------------------------------------------------------------*/
    void execute(MLP& mlp, double tolerance, uint maxIt);

private:

    /*-----------------------------------------------------------------------------
     *  Preenche os dados de treinamento e de teste
     *-----------------------------------------------------------------------------*/
    void fillDataSets(DataSet& training, DataSet& test);

    /*-----------------------------------------------------------------------------
     *  Vetor que diz a qual grupo pertence cada dado
     *-----------------------------------------------------------------------------*/
    vuint group;

    /*-----------------------------------------------------------------------------
     *  Conjunto de dados
     *-----------------------------------------------------------------------------*/
    DataSet& ds;

};

#endif /* HOLDOUT_H_ */
